package cn.net.autocode.maths;

import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 数字格式化
 */
public class NumberFormat {

    /**
     * 格式化整形
     * DecimalFormat 类主要靠 # 和 0 两种占位符号来指定数字长度。
     * 0 表示如果位数不足则以 0 填充，# 表示只要有可能就把数字拉上这个位置。
     * @param num 数值
     * @param format 格式化
     * @return 格式化字符串
     */
    public static String IntFormat(Integer num, String format) {
        DecimalFormat df = new DecimalFormat(format);
        return df.format(num);
    }

    /**
     * 数字转整形
     * @param o 数字
     * @return 整形数字
     */
    public static Integer num2int(Object o) {
        if (o instanceof BigDecimal) {
            return ((BigDecimal) o).intValue();
        } else if (o instanceof Double) {
            return ((Double) o).intValue();
        } else if (o instanceof Float) {
            return ((Float) o).intValue();
        } else if (o instanceof Integer) {
            return ((Integer) o).intValue();
        } else {
            throw new RuntimeException("该类型不能转化为整型");
        }
    }

    /**
     * 字符串转数值
     * @param str 字符串
     * @return 数值
     */
    public static BigDecimal str2num(String str) {
        try {
            BigDecimal bd = new BigDecimal(str);
            return bd;
        } catch (Exception e) {
            return null;
        }
    }

    /**
     * 字符串转数值，非数值型字符串默认转化为0.0
     * @param str 字符串
     * @return 数值
     */
    public static BigDecimal str2numDefaultZero(String str) {
        try {
            BigDecimal bd = new BigDecimal(str);
            return bd;
        } catch (Exception e) {
            return new BigDecimal("0.0");
        }
    }

    /**
     * 判断字符串是否为数值
     * @param numStr 字符串
     * @return 判断结果
     */
    public static boolean isNumric(String numStr) {
        // 该正则表达式可以匹配所有的数字 包括负数
        if (numStr==null||numStr.isBlank()) {
            return false;
        } else {
            Pattern pattern = Pattern.compile("(-|\\+)?[0-9]+\\.?[0-9]*");
            Matcher isNum = pattern.matcher(numStr.trim()); // matcher是全匹配
            if (!isNum.matches()) {
                return false;
            } else {
                return true;
            }
        }
    }
}
